using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using SIOGDE.AccesoDatos.Entidades;
using SIOGDE.AccesoDatos.Contratos;
using SIOGDE.Negocios.Servicios;
using SIOGDE.Negocios.Excepciones;
using SIOGDE.AccesoDatos.Entidades.Reportes;

namespace SIOGDE.Negocios
{
   /// <summary>
   /// Implementacion de la interface IRequerimientoConfigNegociosServicio, los metodos que estan definidos en el contrato IRequerimientoConfigNegociosServicio serán accesibles desde un contexto externo
   /// </summary>	
   public class RequerimientoConfigNegocios : IRequerimientoConfigNegociosServicio
   {
	private IRequerimientoConfigAccesoDatos accesoDatos;
	public RequerimientoConfigNegocios()
	{		
		accesoDatos = DataFactory.Current.GetRequerimientoConfigAccesoDatos();
	}
	
	/// <summary>
    /// Devuelve una lista de RequerimientoConfig's de las ocurrencias encontradas a partir del filtro
    /// </summary>    
	public List<RequerimientoConfig> BuscarPorFiltro(string filtro)
	{
		return accesoDatos.BuscarPorFiltro(filtro, SIOGDE.Negocios.Global.Session.GestionActiva.Id).ToList();
	}

	#region operaciones básicas
	
	/// <summary>
    /// Elimina la entidad RequerimientoConfig, lanzará una excepcion si la entidad guarda dependencia a otras entidades
    /// </summary>	
	public void Eliminar(RequerimientoConfig entidad)
	{
		try
		{
            entidad = accesoDatos.GetById(entidad.Id);
		    accesoDatos.Delete(entidad);
	    }
		catch(Exception ex)
		{
		   throw new RequerimientoConfigEliminarExcepcion("RequerimientoConfig");
		}
	}
	
	/// <summary>
    /// Devuelve RequerimientoConfig, buscada por su Id, si no existe, entonces devuelve null
    /// </summary>	
	public RequerimientoConfig ObtenerPorId(object Id)
	{
		return accesoDatos.GetById(Id);
	}

	/// <summary>
    /// Devuelve List<RequerimientoConfig>, de todas la entidades de ese tipo
    /// </summary>	
	public List<RequerimientoConfig> ObtenerTodas()
	{
		return accesoDatos.GetAll().ToList();
	}

	
	/// <summary>
    /// Guarda RequerimientoConfig, previa ejecucion satisfactoria de las reglas de negocio
    /// </summary>	
	public RequerimientoConfig Guardar(RequerimientoConfig entidad)
	{
        accesoDatos.BeginTransaction();
        try
        {		
		    if(entidad==null)
		        throw new RequerimientoConfigRequeridoExcepcion(); 
		
		    #region Foreign Keys Values
            if(entidad.ArmaId_FK > 0 && entidad.Arma==null)
                entidad.Arma = DataFactory.Current.GetArmaAccesoDatos().GetById(entidad.ArmaId_FK);
            if(entidad.EspecialidadId_FK > 0 && entidad.Especialidad==null)
                entidad.Especialidad = DataFactory.Current.GetEspecialidadAccesoDatos().GetById(entidad.EspecialidadId_FK);
        
            //if(entidad.GestionId_FK > 0 && entidad.Gestion==null)
            //    entidad.Gestion = DataFactory.Current.GetGestionAccesoDatos().GetById(entidad.GestionId_FK);
                
            if(entidad.GradoId_FK > 0 && entidad.Grado==null)
                entidad.Grado = DataFactory.Current.GetGradoAccesoDatos().GetById(entidad.GradoId_FK);
            if(entidad.TipoCargoComandoId_FK > 0 && entidad.TipoCargoComando==null)
                entidad.TipoCargoComando = DataFactory.Current.GetTipoCargoComandoAccesoDatos().GetById(entidad.TipoCargoComandoId_FK);
            if(entidad.UnidadMilitarId_FK > 0 && entidad.UnidadMilitar==null)
                entidad.UnidadMilitar = DataFactory.Current.GetUnidadMilitarAccesoDatos().GetById(entidad.UnidadMilitarId_FK);
            #endregion


            if(entidad.Arma==null || entidad.Grado==null || entidad.UnidadMilitar == null)
                throw new ArmaGradoUnidadMilitarRequeridoExcepcion();

            //regla: no se pueden registrar configuraciones duplicadas en 
            //Arma, Especialidad, Grado, AsignarCargo
                        
            if (accesoDatos.ExisteDuplicado(entidad))
                throw new ConfiguracionDuplicadaExcepcion();
            
            if (string.IsNullOrEmpty(entidad.Guid))
                entidad.Guid = System.Guid.NewGuid().ToString();
            
            if (entidad.NumPersonas <= 0)
                throw new NumeroDePersonasNoValidoExcepcion();
            if ((entidad.PromocionDesde== null || entidad.PromocionHasta == null) || entidad.PromocionDesde > entidad.PromocionHasta)
                throw new RangoFechaNoValidoExcepcion();
            
            entidad.Gestion = SIOGDE.Negocios.Global.Session.GestionActiva;
            entidad.RegistradoPor = SIOGDE.Negocios.Global.Session.UserInfo.Nombre;
            entidad.AutorizadoPor = SIOGDE.Negocios.Global.Session.UserInfo.Nombre;
            entidad.FechaRegistro = DateTime.Now;
            
            if (entidad.Id == 0)
            {           
                accesoDatos.Insert(entidad);
            }
            else
                accesoDatos.Update(entidad);

            accesoDatos.CommitTransaction();

		    return entidad;
        }
        catch (Exception e)
        {           
            accesoDatos.RollbackTransaction();
            throw e;
        }
	}

	#endregion

    public RequerimientoConfig GetPorGuid(string guidReq)
    {
        return accesoDatos.GetPorGuid(guidReq);
    }


    public List<RequerimientoConfig> GetPorUnidadGuid(string guid)
    {
        return accesoDatos.GetPorUnidadGuid(guid, SIOGDE.Negocios.Global.Session.GestionActiva.Id).ToList();
    }

    public List<DTORequerimientoConfig> GetConfigReporte(int GestionId, List<string> UnidadesIds)
    {
        return accesoDatos.GetConfigReporte(GestionId, UnidadesIds).ToList();
    }

    public List<DTORequerimientoPorArma> GetConfigReportePorArma(int GestionId, List<string> armaIds)
    {
        return accesoDatos.GetRequerimientoPorArma(GestionId, armaIds).ToList();
    }
   }
}


